package io.github.bigbird0101.youyishi.code;

import lombok.*;

import java.util.List;

/**
 * java代码结构
 * @author m15179835326@163.com
 * @date 2023-03-23 17:36
 */
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class JavaCodeInfo {
    /**
     * 导入的包
     */
    private List<String> imports;
    private String className;
    private Boolean isInterface;
    private String superClass;
    private List<String> implInterfaces;
    private List<String> constructors;
    private List<String> fields;
    private List<MethodInfo> methods;
    /**
     * 类上的注解 里面的map放的是注解的值
     * {
     *     "注解名":{"注解属性":"注解值"}
     * }
     */
    private List<AnnotationInfo<?>> classAnnotations;

    @Getter
    @Setter
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public static class AnnotationInfo<T>{
        private String annotationName;
        private String property;
        private String valueType;
        private T annotationValue;

        public AnnotationInfo(String annotationName) {
            this.annotationName = annotationName;
        }
    }

    @Getter
    @Setter
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    public static class MethodInfo{
        /**
         * 方法名
         */
        private String methodName;
        /**
         * 方法内容 当类为接口时这个字段为空
         */
        private String methodContent;
        /**
         * 方法返回值类名 当类为接口时这个会被使用
         */
        private String methodReturnTypeClassName;
        /**
         * 参数类名 当类为接口时这个会被使用
         */
        private List<String> paramClassNames;
        /**
         * 参数类名 当类为接口时这个会被使用
         */
        private List<String> exceptionClassNames;

        /**
         * 方法上的注解
         */
        private List<AnnotationInfo<?>> annotationInfos;

        /**
         * 方法参数上的注解
         */
        private List<List<AnnotationInfo<?>>> paramAnnotationInfos;
    }
}
